package formal.string;

import java.util.HashMap;

/**
 * @author DengYuan2
 * @create 2021-02-01 21:27
 */
public class E_205 {
    public static void main(String[] args) {
        String s = "badc";
        String t = "babc";
        boolean isomorphic = isIsomorphic(s, t);
        System.out.println(isomorphic);
    }

    /**
     * 我的写法一直是错的，不能应付paper和title，对于这种一对多的，要用两个map了；要么，就换一种思路啊，像大神那样
     * 所以这个写法是官方的哦
     *
     * @param s
     * @param t
     * @return
     */
    public static boolean isIsomorphic(String s, String t) {
        char[] cs = s.toCharArray();
        char[] ct = t.toCharArray();
        HashMap<Character, Character> s2t = new HashMap<>();
        HashMap<Character, Character> t2s = new HashMap<>();
        for (int i = 0; i < cs.length; i++) {
            char c1 = cs[i];
            char c2 = ct[i];
            if ((s2t.containsKey(c1) && s2t.get(c1) != c2) || (t2s.containsKey(c2) && t2s.get(c2) != c1)) {
                return false;
            }
            s2t.put(c1, c2);
            t2s.put(c2, c1);
        }

        return true;
    }

    /**
     * 大神的思路：数组记录一个字符上次出现的位置，如果两个字符串中的字符上次出现的位置一样，那么就属于同构
     * 关键是好好理解思路啊！！！
     *
     * @param s
     * @param t
     * @return
     */
    public static boolean isIsomorphic2(String s, String t) {
        int[] sc = new int[256];
        int[] tc = new int[256];
        for (int i = 0; i < s.length(); i++) {
            char cs = s.charAt(i);
            char ct = t.charAt(i);
            if (sc[cs] != tc[ct]) {
                return false;
            }
            sc[cs] = i + 1;
            tc[ct] = i + 1;
        }
        return true;
    }
}
